/*
* GerenciadorArquivo.java
*
* Copyright 2011 Monica S. Cavalcante.
* All rights reserved.
*
* This file is part of Mandatory Arrest
*
* MandatoryArrest is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* MandatoryArrest is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MandatoryArrest. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* Isabella Pessoa isabella.agp at gmail.com
* Michell Jacks michelljacks at gmail.com
* Monica Santana monicaasc.cc at gmail.com
*/

package br.edu.ufcg.dsc.lp2.projeto.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import br.edu.ufcg.dsc.lp2.projeto.model.Estabelecimento;
import br.edu.ufcg.dsc.lp2.projeto.model.Usuario;

/**
 * Gerencia as informacoes dos arquivos.
 * 
 * @author Monica Santana monicaasc.cc at gmail.com
 * 
 */
public class GerenciadorArquivo {

        /**
         * Recebe uma lista com os dados de um arquivo com as informacoes dos
         * estabelecimentos, cria os objetos (Estabelecimento), e retorna uma lista
         * com todos os estabelecimentos no arquivo.
         * 
         * @param linhas
         *            Linhas de um arquivo.
         * @return Lista com todos os estabelecimentos.
         */
        public static List<Estabelecimento> separaEstabelecimentos(
                        List<String> linhas) {
                String nome, endereco, tipo;
                List<Estabelecimento> estabelecimentos = new ArrayList<Estabelecimento>();
                for (int i = 1; i < linhas.size(); i++) { // Captura os dados a partir
                                                         // do indice 1.
                                                                                                       
                        String[] infor = linhas.get(i).split(";");
                        nome = infor[0];
                        endereco = infor[1];
                        tipo = infor[2];
                        Estabelecimento local = new Estabelecimento(nome, endereco, tipo);
                        estabelecimentos.add(local);
                }
                return estabelecimentos;
        }

        /**
         * Recebe um Array com as linhas de um arquivo e separar as informacoes.
         * 
         * @param linhas
         *            List com as linhas do arquivo com as opinioes.
         * @param estabelecimentos
         *            Lista com os Estabelecimentos [Objetos].
         * @return Lista de usuarios.
         */
        public static List<Usuario> separaUsuarios(List<String> linhas,
                        List<Estabelecimento> estabelecimentos) {

                List<Usuario> usuarios = new ArrayList<Usuario>();
                String nome;
                int nota;
                int contaAnonimo = 1;

                for (int i = 1; i < linhas.size(); i++) { // Ignora a 1 linha do
                                                                                                        // arquivo.
                        Map<Estabelecimento, Integer> opinioes = new HashMap<Estabelecimento, Integer>();
                        String[] infor = linhas.get(i).split(";");
                        nome = infor[1].equals("") || infor[1] == null ? "Anonimo"
                                        + contaAnonimo++ : infor[1];
                        Usuario usuario = new Usuario(nome, estabelecimentos);

                        // Obtem as opinioes de cada estabelecimento.
                        for (int j = 2; j < infor.length; j++) {
                                nota = Integer.parseInt((infor[j].split(":")[0]).trim());
                                // Adiciona a opiniao ao usuario, e no estabelecimento.
                                usuario.adicionaOpiniao(estabelecimentos.get(j - 2), nota);
                                estabelecimentos.get(j - 2).votar(nota);
                        }
                        usuarios.add(usuario);
                }
                return usuarios;
        }

        
        /**
         * Imprime a opinao dos usuarios sobre o estabelecimento. nota: Usuario.
         * @param estabelecimento Um estabelecimento.
         * @param usuarios Lista de usuarios cadastrados.
         */
        // Case 1
        public static List<String> retorna(Estabelecimento estabelecimento,
                        List<Usuario> usuarios) {
                List<String> resultado = new ArrayList<String>();
                for (int i = 0; i < usuarios.size(); i++) {
                    resultado.add((usuarios.get(i).getNome())+" : "+usuarios.get(i).getNota(estabelecimento));
                    
                }
                return resultado;

        }
}